package com.librelato.tela;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import com.librelato.bean.AcaoAtaEletronicaBean;
import com.librelato.bean.AtaEletronicaBean;
import com.librelato.bean.DiretoriaBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.negocio.AtaEletronicaServico;
import com.librelato.negocio.UsuarioServico;
import com.librelato.negocio.interfaces.IServicoGenerico;
import com.librelato.util.Ferramentas;

@ManagedBean
@ViewScoped
public class AtaEletronicaTela extends TelaAbstrata {

	@ManagedProperty(value = "#{usuario}")
	private UsuarioBean usuario;

	private List<DiretoriaBean> listaDiretorias;

	private AtaEletronicaBean ataEletronica;

	private DiretoriaBean diretoriaAta;

	private AtaEletronicaServico<AtaEletronicaBean> ataEletronicaServico;

	private UsuarioServico<UsuarioBean> usuarioServico;

	private Map<String, String> param;

	private AcaoAtaEletronicaBean acaoAta;

	private List<AcaoAtaEletronicaBean> listaAcoesAta;

	private String filialAtaFiltro;

	private String codigoDiretoriaFiltro;

	private Date dataAtaDeFiltro;

	private Date dataAtaAteFiltro;

	private List<AtaEletronicaBean> listaAtasBusca;

	private UsuarioBean responsavelFiltro;

	private String numeroAtaFiltro;

	private String assuntoFiltro;

	public AtaEletronicaTela() {
		ataEletronica = new AtaEletronicaBean();
		diretoriaAta = new DiretoriaBean();
		ataEletronicaServico = new AtaEletronicaServico<AtaEletronicaBean>();
		usuarioServico = new UsuarioServico<UsuarioBean>();
		param = new HashMap<String, String>();
		acaoAta = new AcaoAtaEletronicaBean();
		listaAcoesAta = new ArrayList<AcaoAtaEletronicaBean>();
		param = new HashMap<String, String>();
	}

	public void salvar() {
		try {
			if (!ataEletronica.getAssuntosTratadosAta().trim().equals("")) {
				ataEletronica.setAcoesAta(listaAcoesAta);
				ataEletronica.setUsuarioDono(usuario);
				ataEletronicaServico.salvar(ataEletronica);
				listaAcoesAta = new ArrayList<AcaoAtaEletronicaBean>();
				imprime(ataEletronica);
				// ataEletronicaServico.imprimeAta(ataEletronica,
				// usuario.getCodigo());
				ataEletronica = new AtaEletronicaBean();
				RequestContext.getCurrentInstance().execute(
						"mostraAta(" + usuario.getCodigo() + ")");
			} else {
				FacesMessage msg = new FacesMessage(
						FacesMessage.SEVERITY_ERROR, this.getServico()
								.getValor("msg_header_erro"),
						"Campo \"Assuntos Abordados\" é Obrigatório.");
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void imprime(AtaEletronicaBean ata) {
		try {
			ataEletronicaServico.imprimeAta(ata, usuario.getCodigo());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void preencheCombo() {
		try {
			listaDiretorias = ataEletronicaServico.buscaDiretorias(null);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public List<UsuarioBean> autoCompleteResponsavel(String query) {
		List<UsuarioBean> usuarios = new ArrayList<UsuarioBean>();
		try {
			param.put("NOME_LIKE", query);
			usuarios = usuarioServico.buscaUsuariosCadastrados(param);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return usuarios;
	}

	public String reinitAcaoAta() {
		acaoAta = new AcaoAtaEletronicaBean();
		return null;
	}

	public void filtrarAtas() {
		try {
			param.put("FILIALATA", filialAtaFiltro);
			param.put("DIRETORIAATA", codigoDiretoriaFiltro);
			param.put("NUMEROATA", numeroAtaFiltro);
			param.put("ASSUNTOATA", assuntoFiltro);
			param.put("NIVELACESSOATA", usuario.getNivelDeAcessoAta() + "");
			if (dataAtaDeFiltro != null) {
				param.put("DATAATADE", Ferramentas.formataData(
						dataAtaDeFiltro.getTime(), "yyyy-MM-dd"));
			}

			if (dataAtaAteFiltro != null) {
				param.put("DATAATAATE", Ferramentas.formataData(
						dataAtaAteFiltro.getTime(), "yyyy-MM-dd"));
			}
			param.put("USUARIOATA", usuario.getCodigo());
			/*
			 * if (responsavelFiltro != null) { param.put("RESPONSAVELATA",
			 * responsavelFiltro.getCodigo()); } else {
			 * param.remove("RESPONSAVELATA"); }
			 */

			listaAtasBusca = ataEletronicaServico.buscaAtaEletronica(param);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void uploadArquivo(FileUploadEvent evento) {
		FacesMessage msg = null;

		try {
			ataEletronica.setListaDePresencaReuniao(evento.getFile()
					.getContents());
			ataEletronica.setExtensaoListaPresenca(evento.getFile()
					.getContentType());
			ataEletronicaServico.editar(ataEletronica);
			filtrarAtas();
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_sucesso_lista_ata"));

		} catch (Exception e) {
			e.printStackTrace();
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_lista_ata"));
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public StreamedContent downloadArquivo(AtaEletronicaBean ata) {

		StreamedContent file = new DefaultStreamedContent(
				new ByteArrayInputStream(ata.getListaDePresencaReuniao()),
				ata.getExtensaoListaPresenca(), "Lista Presença");

		return file;
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.ataEletronicaServico;
	}

	public List<DiretoriaBean> getListaDiretorias() {
		return listaDiretorias;
	}

	public void setListaDiretorias(List<DiretoriaBean> listaDiretorias) {
		this.listaDiretorias = listaDiretorias;
	}

	public AtaEletronicaBean getAtaEletronica() {
		return ataEletronica;
	}

	public void setAtaEletronica(AtaEletronicaBean ataEletronica) {
		this.ataEletronica = ataEletronica;
	}

	public DiretoriaBean getDiretoriaAta() {
		return diretoriaAta;
	}

	public void setDiretoriaAta(DiretoriaBean diretoriaAta) {
		this.diretoriaAta = diretoriaAta;
	}

	public AcaoAtaEletronicaBean getAcaoAta() {
		return acaoAta;
	}

	public void setAcaoAta(AcaoAtaEletronicaBean acaoAta) {
		this.acaoAta = acaoAta;
	}

	public List<AcaoAtaEletronicaBean> getListaAcoesAta() {
		return listaAcoesAta;
	}

	public void setListaAcoesAta(List<AcaoAtaEletronicaBean> listaAcoesAta) {
		this.listaAcoesAta = listaAcoesAta;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public AtaEletronicaServico<AtaEletronicaBean> getAtaEletronicaServico() {
		return ataEletronicaServico;
	}

	public void setAtaEletronicaServico(
			AtaEletronicaServico<AtaEletronicaBean> ataEletronicaServico) {
		this.ataEletronicaServico = ataEletronicaServico;
	}

	public UsuarioServico<UsuarioBean> getUsuarioServico() {
		return usuarioServico;
	}

	public void setUsuarioServico(UsuarioServico<UsuarioBean> usuarioServico) {
		this.usuarioServico = usuarioServico;
	}

	public Map<String, String> getParam() {
		return param;
	}

	public void setParam(Map<String, String> param) {
		this.param = param;
	}

	public String getFilialAtaFiltro() {
		return filialAtaFiltro;
	}

	public void setFilialAtaFiltro(String filialAtaFiltro) {
		this.filialAtaFiltro = filialAtaFiltro;
	}

	public String getCodigoDiretoriaFiltro() {
		return codigoDiretoriaFiltro;
	}

	public void setCodigoDiretoriaFiltro(String codigoDiretoriaFiltro) {
		this.codigoDiretoriaFiltro = codigoDiretoriaFiltro;
	}

	public Date getDataAtaDeFiltro() {
		return dataAtaDeFiltro;
	}

	public void setDataAtaDeFiltro(Date dataAtaDeFiltro) {
		this.dataAtaDeFiltro = dataAtaDeFiltro;
	}

	public Date getDataAtaAteFiltro() {
		return dataAtaAteFiltro;
	}

	public void setDataAtaAteFiltro(Date dataAtaAteFiltro) {
		this.dataAtaAteFiltro = dataAtaAteFiltro;
	}

	public List<AtaEletronicaBean> getListaAtasBusca() {
		return listaAtasBusca;
	}

	public void setListaAtasBusca(List<AtaEletronicaBean> listaAtasBusca) {
		this.listaAtasBusca = listaAtasBusca;
	}

	public UsuarioBean getResponsavelFiltro() {
		return responsavelFiltro;
	}

	public void setResponsavelFiltro(UsuarioBean responsavelFiltro) {
		this.responsavelFiltro = responsavelFiltro;
	}

	public String getNumeroAtaFiltro() {
		return numeroAtaFiltro;
	}

	public void setNumeroAtaFiltro(String numeroAtaFiltro) {
		this.numeroAtaFiltro = numeroAtaFiltro;
	}

	public String getAssuntoFiltro() {
		return assuntoFiltro;
	}

	public void setAssuntoFiltro(String assuntoFiltro) {
		this.assuntoFiltro = assuntoFiltro;
	}

}
